package main

import (
	"fmt"
	"os"
	"reflect"
	"sync"
)

func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

type CharCount struct {
	ChCount    int
	NumCount   int
	SpaceCount int
	OtherCount int
}
type Monster struct {
	Name     string `json:"name"`
	Age      int    `json:"age"`
	Birthday string
	Sal      float64
	Skill    string
}

func (m *Monster) Say() {
	fmt.Println("无参函数被调用")
}

func (m *Monster) Hello(s int, s2 int) (int, int) {
	fmt.Printf("s=%v, s2=%v\n", s, s2)
	return s + s2, s - s2
}

type Monster2 struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

var (
	m1   map[int]int
	lock sync.Mutex
)

func test(n int) {
	res := 1
	for i := 1; i < n; i++ {
		res *= i
	}
	lock.Lock()
	m1[n] = res
	lock.Unlock()
}

func reflectTest(i interface{}) {
	//rType := reflect.TypeOf(i)
	//fmt.Println("rType=", rType)
	//
	rValue := reflect.ValueOf(i)
	fmt.Printf("rValue=%v, rValueType=%T\n", rValue, rValue)
	//
	//n1 := rValue.Int()
	////n2 := rValue.Float()
	//fmt.Printf("n1=%v, n1=%T\n", n1, n1)
	////fmt.Printf("n1=%v, n1=%T\n", n2, n2)
	//
	//f1 := rValue.Interface()
	//fmt.Printf("f1=%v, f1=%T\n", f1, f1)
	//
	//n := f1.(int) + 1
	//fmt.Printf("n=%v, n=%T\n", n,n1)
	//
	//fmt.Printf("rType.Kind()=%v, rValue.Kind()=%v,\n", rType.Kind(), rValue.Kind())

	rValue.Elem().SetInt(10)
}

func main() {




	//m1 := &Monster{
	//	Name:     "礼物呢",
	//	Age:      1,
	//	Birthday: "2022",
	//	Sal:      1.1,
	//	Skill:    "飞翔",
	//}
	//rValue := reflect.ValueOf(m1)
	//rType := reflect.TypeOf(m1)
	////rKind := rValue.Kind()
	//fmt.Printf("值的数量为:%v\n", rValue.Elem().NumField())
	//for i := 0; i < rValue.Elem().NumField(); i++ {
	//	fmt.Printf("Field %d:值为=%v", i, rValue.Elem().Field(i))
	//	tagVal := rType.Elem().Field(i).Tag.Get("json")
	//	if tagVal != "" {
	//		fmt.Printf("\tField %d:tag为=%v", i, tagVal)
	//	}
	//	fmt.Println()
	//}
	//numMethod := rValue.NumMethod()
	//fmt.Printf("struct has %v methods\n", numMethod)
	//
	////rValue.MethodByName("Say").Call(nil)
	//var param []reflect.Value
	//p1 := reflect.ValueOf(1)
	//p2 := reflect.ValueOf(2)
	//param = append(param, p1)
	//param = append(param, p2)
	//res := rValue.Method(0).Call(param)
	//fmt.Printf("res[0]=%v, res[1]=%v\n, res[0].type=%T, res[1].type=%T\n",
	//	res[0].Int(),  res[1].Int(), res[0].Int(),  res[1].Int())

	//str := 1
	//reflect.ValueOf(&str).Elem().SetInt(2)
	//fmt.Printf("str=%v\n", str)

	//str := map[int]int{
	//	1: 2,
	//	2: 3,
	//}
	//rVal := reflect.ValueOf(str)
	//f2 := rVal.Interface().(map[int]int) //类型断言 如果结果字段确定可以不用类型判断
	//f2[1] = 3
	//f2[2] = 4
	//fmt.Printf("%v\n", f2)

	//num := 1
	//reflectTest(&num)
	//fmt.Printf("num=%v\n", num)

	//c := make(chan<- int)
	//c <- 1
	//<- c

	//start := time.Now().Unix()
	//for v := 0; v < 80000; v++ {
	//	var flag = true
	//	for i := 2; i < v; i++ {
	//		if v%i == 0 {
	//			flag = false
	//			break
	//		}
	//	}
	//	if flag {
	//
	//	}
	//}
	//end := time.Now().Unix()
	//fmt.Println("总共耗时为:", end-start)

	//start := time.Now().Unix()
	//count := 20000
	//intChan := make(chan int, count)
	//primeChan := make(chan int, 100)
	//exitChan := make(chan bool, 4)
	//
	//go func(intChan chan int, count int) {
	//	for i := 1; i <= count; i++ {
	//		intChan <- i
	//	}
	//	close(intChan)
	//}(intChan, count)
	//for i := 0; i < 4; i++ {
	//	go func(intChan chan int, primeChan chan int, exitChan chan bool) {
	//		for {
	//			v, ok := <-intChan
	//			if !ok {
	//				exitChan <- true
	//				break
	//			}
	//			var flag = true
	//			for i := 2; i < v; i++ {
	//				if v%i == 0 {
	//					flag = false
	//					break
	//				}
	//			}
	//			if flag {
	//				primeChan <- v
	//			}
	//		}
	//		fmt.Println("有一个协程取不到数据退出")
	//	}(intChan, primeChan, exitChan)
	//}
	//
	//go func(exitChan chan bool) {
	//	for i := 0; i < 4; i++ {
	//		<-exitChan
	//	}
	//	end := time.Now().Unix()
	//	fmt.Println("总共耗时为:", end-start)
	//	close(primeChan)
	//}(exitChan)
	//
	//for {
	//	i, ok := <-primeChan
	//	if !ok {
	//		break
	//	}
	//	fmt.Printf("素数为:%v\n", i)
	//}

	//filename := "/Users/jim/Workdata/testgin0012/file/demo001/data3.txt"
	//c := make(chan int)
	//for i := 0; i < 10; i++ {
	//	go func(filename string, c chan int, i int) {
	//		rand.Seed(time.Now().UnixNano())
	//		res := ""
	//		for i := 0; i < 1000; i++ {
	//			res += "," + strconv.Itoa(rand.Intn(10000)+1)
	//		}
	//		err := ioutil.WriteFile(filename+strconv.Itoa(i)+".txt", []byte(res), 0666)
	//		if err != nil {
	//			fmt.Printf("文件%v写入失败\n")
	//		}
	//		c <- i
	//	}(filename, c, i)
	//}
	//var i = 0
	//for {
	//	_, err := <-c
	//	if err {
	//		if i >= 9 {
	//			break
	//		}
	//		i++
	//	}
	//}
	//for i := 0; i < 10; i++ {
	//	go func(filename string, c chan int, i int) {
	//		f := filename + strconv.Itoa(i) + ".txt"
	//		data, err := ioutil.ReadFile(f)
	//		if err != nil {
	//			fmt.Printf("读取文件:%v, 失败 err=%v\n", filename+strconv.Itoa(i)+".txt", err)
	//			return
	//		}
	//		str := string(data)
	//		list := strings.Split(str, ",")
	//		var arr []int
	//		for _, s := range list {
	//			q, _ := strconv.Atoi(s)
	//			arr = append(arr, q)
	//		}
	//		sort.Ints(arr)
	//		d, err := json.Marshal(arr)
	//		err4 := ioutil.WriteFile(f, d, 0666)
	//		if err4 != nil {
	//			fmt.Printf("文件%v写入失败\n", f)
	//		}
	//		c <- i
	//	}(filename, c, i)
	//}
	//i = 0
	//for {
	//	_, err := <-c
	//	if err {
	//		if i >= 9 {
	//			break
	//		}
	//		i++
	//	}
	//}
	//fmt.Println("执行完成")

	//filename := "/Users/jim/Workdata/testgin0012/file/demo001/data.txt"
	//filename2 := "/Users/jim/Workdata/testgin0012/file/demo001/data2.txt"
	//c := make(chan int)
	//c2 := make(chan int)
	//go func(filename string, c chan int) {
	//	rand.Seed(time.Now().UnixNano())
	//	data := ""
	//	for i := 1; i <= 1000; i++ {
	//		data += "," + strconv.Itoa(rand.Intn(1000)+1)
	//	}
	//
	//	err := ioutil.WriteFile(filename, []byte(data), 0666)
	//	if err != nil {
	//		fmt.Printf("文件:%v写入失败, err=%v\n", filename, err)
	//	}
	//	c <- 1
	//}(filename, c)
	//
	//go func(filename string, c chan int, filename2 string, c2 chan int) {
	//	for {
	//		_, ok := <-c
	//		if ok {
	//			break
	//		}
	//	}
	//	buffer, err := ioutil.ReadFile(filename)
	//	if err != nil {
	//		fmt.Printf("文件%v读取失败, err=%v\n", err)
	//		return
	//	}
	//	data := string(buffer)
	//
	//	var list []string = strings.Split(data, ",")
	//	var arr []int
	//	for _, s := range list {
	//		i, _ := strconv.Atoi(s)
	//		arr = append(arr, i)
	//	}
	//	sort.Ints(arr)
	//	buffer2, _ := json.Marshal(arr)
	//	err2 := ioutil.WriteFile(filename2, buffer2, 0666)
	//	if err2 != nil {
	//		fmt.Printf("%v\n", err2)
	//	}
	//	c2 <- 1
	//}(filename, c, filename2, c2)
	//for {
	//	_, ok := <-c2
	//	if ok {
	//		break
	//	}
	//}
	//fmt.Println("执行完成...")

	//count := 2000s
	//c := make(chan int, count)
	//c2 := make(chan int)
	//for i := 1; i <= count; i++ {
	//	c <- i
	//}
	//for i := 0; i < 8; i++ {
	//	go func(c chan int, c2 chan int) {
	//		for {
	//			n, ok := <-c
	//			if !ok {
	//				break
	//			}
	//			res := 0
	//			for i := 1; i <= n; i++ {
	//				res += i
	//			}
	//			c2 <- res
	//		}
	//	}(c, c2)
	//}
	//var i = 0
	//for {
	//	num, ok := <-c2
	//	if ok {
	//		fmt.Printf("i2=%v\n", num)
	//		i++
	//	}
	//	if i >= count {
	//		break
	//	}
	//}
	//fmt.Println()

	//变量管道时, 不能使用普通的fori 必须使用 for-range
	//如果遍历时 channel没有关闭, 则会出现 deadlock
	//管道没有key forr遍历时 无序指定 key坑位
	//intChan := make(chan int, 100)
	//for i := 0; i < 100; i++ {
	//	intChan<- i * 2
	//}
	//close(intChan)
	//for i2 := range intChan {
	//	fmt.Println(i2)
	//}

	//已关闭的管道可以继续读
	//intChan := make(chan int, 1)
	//intChan<- 10
	//close(intChan)
	////intChan<- 101
	//fmt.Println(intChan)

	//管道属于引用类型, 超出容量不可在
	//var intChan chan int
	//intChan = make(chan int, 1)
	//intChan<-1
	//fmt.Println(<-intChan)
	//intChan<-1
	//fmt.Println(<-intChan)
	//<-intChan
	//fmt.Printf("val=%v, prt=%p, cap=%v, len=%v\n", intChan, &intChan, cap(intChan), cap(intChan))

	//m1 = map[int]int{}
	//for i := 1; i <= 20; i++ {
	//	go test(i)
	//}
	//time.Sleep(time.Second * 2)
	//
	//lock.Lock()
	//fmt.Println(m1)
	//for m, i := range m1 {
	//	fmt.Printf("m=%v, i=%v\n", m, i)
	//}
	//lock.Unlock()
	//fmt.Println(runtime.NumCPU())

	//monster := Monster{
	//	Name:     "牛魔王",
	//	Age:      11,
	//	Birthday: "2020-11-11",
	//	Sal:      1.1,
	//	Skill:    "牛魔全",
	//}
	//data, _ := json.Marshal(monster)
	//fmt.Println(string(data))
	//反序列化
	//data := `{"name":"牛魔王","age":11,"Birthday":"2020-11-11","Sal":1.1,"Skill":"牛魔全"}`
	//var m Monster2
	//json.Unmarshal([]byte(data), &m)
	//fmt.Println(m.Name)
	//fmt.Println(m.Age)

	//m1 := map[string]string{
	//	"name": "刘文金",
	//	"age":  "111",
	//}
	//data, _ := json.Marshal(m1)
	//fmt.Println(string(data))
	//data := `{"age":"111","name":"刘文金"}`//反序列化
	//var m1 map[string]string
	//json.Unmarshal([]byte(data), &m1)
	//fmt.Println(m1["age"])
	//fmt.Println(m1["name"])

	//j1 := []map[string]Monster{
	//	{
	//		"name": monster,
	//	},
	//}
	//data, _ := json.Marshal(j1)
	//fmt.Println(string(data))
	//data:=`[{"name":{"name":"牛魔王","age":11,"Birthday":"2020-11-11","Sal":1.1,"Skill":"牛魔全"}}]`
	//var m []map[string]Monster
	//json.Unmarshal([]byte(data), &m)
	//fmt.Println(m[0]["name"].Name)
	//fmt.Println(m[0]["name"].Age)

	//buff,err := json.Marshal(&monster)
	//buff, err := json.Marshal(m1)
	//buff, err := json.Marshal(j1)
	//if err != nil {
	//	fmt.Printf("err=%v\n", err)
	//	return
	//}
	//fmt.Println(string(buff))

	//var user string
	//var passwd string
	//var host string
	//var port int
	//flag.StringVar(&user, "u", "", "用户名,默认值为空")
	//flag.StringVar(&passwd, "p", "", "密码,默认值为空")
	//flag.StringVar(&host, "h", "localhost", "密码,默认值为localhost")
	//flag.IntVar(&port, "P", 3306, "密码,默认值为3306")
	//flag.Parse()
	//
	//fmt.Printf("user=%v,passwd=%v,host=%v,port=%v\n", user, passwd, host, port)

	//filename := "/Users/jim/Workdata/testgin0012/file/demo001/data.txt"
	//file, err := os.Open(filename)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//defer file.Close()
	//var count CharCount
	//reader := bufio.NewReader(file)
	//for {
	//	str, err := reader.ReadString('\n')
	//	//fmt.Print(str)
	//	for _, c := range str {
	//		switch {
	//		case c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z':
	//			count.ChCount++
	//		case c >= '0' && c <= '9':
	//			count.NumCount++
	//		case c == ' ' || c == '\t':
	//			count.SpaceCount++
	//		default:
	//			count.OtherCount++
	//		}
	//	}
	//	if err == io.EOF {
	//		break
	//	}
	//}
	//fmt.Printf("ch=%v, num=%v, space=%v, other=%v\n", count.ChCount,
	//	count.NumCount, count.SpaceCount, count.OtherCount)

	//filename := "/Users/jim/Workdata/testgin0012/file/demo001/data.txt"
	//filename2 := filename + "2.txt"

	//buff, err := ioutil.ReadFile(filename + ".txt")
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//if b, _ := PathExists(filename2); !b {
	//	fmt.Printf("文件 %v 不存在\n", filename2)
	//}
	//if err = ioutil.WriteFile(filename2, buff, 0666); err != nil {
	//	fmt.Println("写文件失败,err=", err)
	//}

	//filename := "/Users/jim/Workdata/testgin0012/file/demo001/data.txt"
	//filename3 := filename + "3.txt"
	//file, err := os.Open(filename)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//reader := bufio.NewReader(file)
	//file3, err := os.OpenFile(filename3, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//writer := bufio.NewWriter(file3)
	//l, err := io.Copy(writer, reader)
	//if err != nil || l <= 0 {
	//	fmt.Println("拷贝失败", err)
	//	return
	//}
	//fmt.Println("拷贝文件成功")

	//file, err := os.OpenFile(filename, os.O_RDWR|os.O_APPEND, 0666)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//defer file.Close()
	//
	//writer := bufio.NewWriter(file)
	//_, err = writer.WriteString("abc22\r\n")
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//defer writer.Flush()
	//reader := bufio.NewReader(file)
	//for {
	//	str, err := reader.ReadString('\n')
	//	fmt.Print(str)
	//	if err == io.EOF {
	//		break
	//	}
	//}

	//reader := bufio.NewReader(file)
	//for  {
	//	str, err := reader.ReadString('\n')
	//	fmt.Print(str)
	//	if err == io.EOF {
	//		break
	//	}
	//}
	//fmt.Println()

	//buff, err := ioutil.ReadFile(filename)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//fmt.Println(string(buff))

	//file, err := os.Open(filename)
	//if err != nil {
	//	fmt.Printf("文件:%v读取失败\n", file)
	//	return
	//}
	//defer file.Close()
	//reader := bufio.NewReader(file)
	//for {
	//	line, err2 := reader.ReadString('\n')
	//	fmt.Print(line)
	//	if err2 != nil {
	//		break
	//	}
	//}
	//fmt.Println()
}
